package com.openthinks.joyniproject.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.slf4j.Logger;

@SuppressWarnings({ "rawtypes","unchecked", "null" })
public class JsonUtil {
	private static final Logger logger = org.slf4j.LoggerFactory
		.getLogger(JsonUtil.class);
	
	/**
	 * 将json字符串转换为Map对象
	 * @param data json字符串
	 * @return 包含json信息的Mapd对象
	 * */
	public static Map<String,Object> convertToMap(Object data){
		Map<String,Object> resultMap = null;
		try{
			JSONObject jsonObj = JSONObject.fromObject(data);
			resultMap = (Map<String,Object>)JSONObject.toBean(jsonObj, Map.class);
		}catch(Exception e){
			logger.error("", "Json字符串转换失败:" + data);
			logger.error(e.getLocalizedMessage(),e.getMessage());
		}
		return resultMap;
	}
	
	/**
	 * 将json字符串转换为List对象
	 * @param data json字符串
	 * @return 包含json信息的List的对象
	 * */
	public static List<Map> convertToList(Object data){
		List<Map> resultList = new ArrayList<Map>();
		try{
			JSONArray jsonObj = JSONArray.fromObject(data);
			int size = jsonObj.size();
			for(int idx = 0; idx < size;idx++){
				resultList.add(convertToMap(jsonObj.get(idx)));
			}
		}catch(Exception e){
			logger.error("", "Json字符串转换失败:" + data);
			logger.error(e.getLocalizedMessage(),e.getMessage());
		}
		return resultList;
	}
	
	/**
	 * 将json字符串转换为List
	 * @param data json字符串
	 * @return 包含json信息的List的对象
	 * */
	public static List convertToListSimple(Object data){
		List resultList = new ArrayList();
		try{	
			JSONArray jsonArray = JSONArray.fromObject(data);
			int size = jsonArray.size();
			for(int idx = 0; idx < size;idx++){
				resultList.add((jsonArray.get(idx)));
			}
		}catch(Exception e){
			logger.error("", "Json字符串转换失败:" + data);
			logger.error(e.getLocalizedMessage(),e.getMessage());
		}
		return resultList;
	}
	
	/**
	 * 对象转Json串，如Map
	 * @param object，
	 * @return
	 */
	public static String objectToJson(Object object) {
		JSONObject jsonObj = JSONObject.fromObject(object);
		return jsonObj.toString() ;
	}
	
	/**
	 * 数组、容器转Json串，如List
	 * @param object，
	 * @return
	 */
	public static String arrayToJson(Object object) {
		JSONArray jsonArray = JSONArray.fromObject(object);
		return jsonArray.toString();
	}
	
	/**
	 * 把结果渲染到ModelAndView
	 * @param model:对象列表
	 * @return 对象Map
	 */
	public static final Map<String,Object> getMap(List model){
		
		Map<String,Object> modelMap = new HashMap<String,Object>(3);
		modelMap.put("total", (model != null)?model.size():0);
		modelMap.put("data", model);
		modelMap.put("success", true);
		
		return modelMap;
	}
	
	/**
	 * 把异常信息渲染到ModelAndView
	 * @param msg 异常信息
	 * @return 对象Map
	 */
	public static final Map<String,Object> getModelMapError(String msg){
		Map<String,Object> modelMap = new HashMap<String,Object>(2);
		modelMap.put("message", msg);
		modelMap.put("success", false);
		return modelMap;
	} 
	
	/**
	 * 将json字符串转换为Map对象
	 * @param data json字符串
	 * @return 包含json信息的Mapd对象
	 * */
	public static Map<String,Object> convertToMap2(Map data){
		Map<String,Object> resultMap = null;
		try{
			Set<String> keySet = data.keySet();
			for (String key : keySet) {
				resultMap.put(key, getObjectFrmMap(resultMap,key));
			}
			
		}catch(Exception e){
			logger.error("", "Json字符串转换失败:" + data);
			logger.error(e.getLocalizedMessage(),e.getMessage());
		}
		return resultMap;
	}
	
	/**
	 * 将json字符串转换为List对象
	 * @param data json字符串
	 * @return 包含json信息的List的对象
	 * */
	public static List<Map> convertToList2(List<Map> data){
		List<Map> resultList = new ArrayList<Map>();
		try{
			int size = data.size();
			for(int idx = 0; idx < size;idx++){
				resultList.add(convertToMap2(data.get(idx)));
			}
		}catch(Exception e){
			logger.error("", "Json字符串转换失败:" + data);
			logger.error(e.getLocalizedMessage(),e.getMessage());
		}
		return resultList;
	}
	
	/**
	 * 将json字符串转换为Map对象
	 * @param data json字符串
	 * @return 包含json信息的Mapd对象
	 * */
	public static Object getObjectFrmMap(Map<String,Object> data,String key){
		if("".equals(key) 
				|| null == key  
				|| "null".equals(key) ){
			return null;
		}
		return data.get(key);
	}
	
	//测试
	public static void main(String[] args) {
		Map map = new HashMap();
		map.put("name", "gao");
		map.put("sex", "male");
		List list = new ArrayList();
		list.add(map);
		list.add(map);
		list.add(map);
		System.out.println(JsonUtil.objectToJson(map));
		System.out.println(JsonUtil.arrayToJson(list));
	}
	
	/**
	 * 操作超时或者session失效时,调用
	 * 把异常信息渲染到ModelAndView
	 * @param msg 异常信息
	 * @return 对象Map
	 */
	public static final Map<String,Object> getTimeOutError(String msg){
		Map<String,Object> modelMap = new HashMap<String,Object>(2);
		modelMap.put("message", msg);
		modelMap.put("success", false);
		modelMap.put("timeout", true);
		return modelMap;
	} 
	
	/**
	 * 把Map 对象中的JSONObject 空对象转为java 中null
	 * @param data  ： 包含key 的Map
	 * @param key   ： Map中需要替换的键
	 */
	public static final void replaceJSONObject(Map data,String key){
		if(data != null && key != null){
			if(data.containsKey(key)){
				if(data.get(key) != null && data.get(key) instanceof JSONObject){
					data.put(key, null);
				}
			}
		}
	}
	
	/**
	 * 把Map 对象中的JSONObject 空对象转为java 中null
	 * @param list  ： List<Map>
	 */
	public static final void replaceJSONObject(List<Map> list) {
		if(null != list){
			if(!list.isEmpty()){
				for(int index = 0; index < list.size();index++){
					Map map = list.get(index);
					Set<String> keySet = map.keySet();
					for (String key : keySet) {
						replaceJSONObject(map,key);
					}
				}
			}
		}
	} 
	
	public static Map cleanBlankParams(Map<String, Object> params) {
		List<String> cleanList = new ArrayList();
		for (String key : params.keySet()) {
			if (params.get(key) == null) {
				cleanList.add(key);
			} else if (params.get(key).toString().trim().equals("")) {
				cleanList.add(key);
			} else if (params.get(key).toString().equals("null")) {
				cleanList.add(key);
			}
		}
		
		for (String key : cleanList) {
			params.remove(key);
		}
		return params;
	}
}
